/*-------------------------------------------------------------------------
 *
 * legacy-pqsignal.c
 *	  可靠的 BSD 风格的 signal(2) 例程，盗自 RWW，后者又盗自斯蒂文斯...
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/interfaces/libpq/legacy-pqsignal.c
 *
 *-------------------------------------------------------------------------
 */
#include "postgres_fe.h"

#include <signal.h>


/*
 * 这个版本的 pqsignal() 之所以存在，仅仅是因为 9.3 之前的 libpq 导出了 pqsignal()，而一些旧的客户端程序仍然依赖于它。 （从 9.3 开始，客户端本应从 libpgport 获取它。）
 *
 * 由于它仅用于向后兼容，我们将其冻结为 9.2 中的语义；特别是，这与 src/port/pqsignal.c 中的版本在 SIGALRM 的行为上有所不同。
 *
 * libpq 本身并不使用这个，我们的代码中的其他任何东西也不使用。
 *
 * src/include/port.h 将 #define pqsignal 为 pqsignal_fe，但在这里我们想要导出简单的 "pqsignal"。 我们也不能依赖 port.h 的 extern 声明。 （这个 #define 的意图是确保没有树内代码意外地调用这个版本。）
 */
#undef pqsignal
extern pqsigfunc pqsignal(int fc_signo, pqsigfunc fc_func);

pqsigfunc pqsignal(int fc_signo, pqsigfunc fc_func)
{
#ifndef WIN32
	struct sigaction fc_act,
				fc_oact;

	fc_act.sa_handler = fc_func;
	sigemptyset(&fc_act.sa_mask);
	fc_act.sa_flags = 0;
	if (fc_signo != SIGALRM)
		fc_act.sa_flags |= SA_RESTART;
#ifdef SA_NOCLDSTOP
	if (fc_signo == SIGCHLD)
		fc_act.sa_flags |= SA_NOCLDSTOP;
#endif
	if (sigaction(fc_signo, &fc_act, &fc_oact) < 0)
		return SIG_ERR;
	return fc_oact.sa_handler;
#else							/* WIN32 */
	return signal(signo, func);
#endif
}
